/**
 * 
 */
package com.mixsmart.core.dao;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;

import com.mixsmart.core.bean.Paginate;
import com.mixsmart.core.bean.entity.IEntityBean;
import com.mixsmart.spellsql.ICondition;

/**
 * 查询实体DAO接口
 * @author lmq
 * @version 1.0
 * @since JDK版本大于等于1.6
 * 2015年12月21日
 * @param <T>
 * @param <PK>
 */
public interface IQueryEntityDao<T extends IEntityBean, PK extends Serializable> extends IQueryDao {

	/**
	 * 通过主键值获取对应的实体对象数据
	 * @param id 主键值
	 * @return 返回实体对象
	 */
	public T find(PK id);
	
	/**
	 * 通过主键值获取对应的实体对象数据
	 * @param clazz
	 * @param id 主键值
	 * @return 返回实体对象
	 */
	public <E> E find(Class<? extends IEntityBean> clazz,PK id);
	
	/**
	 * 获取所有数据
	 * @return 返回实体对象集合
	 */
	public List<T> findAll();
	
	/**
	 * 根据条件查询(返回唯一值)
	 * @param condition 查询对象  <br />
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @return 返回实体对象
	 */
	public T find(ICondition condition);
	
	/**
	 * 根据条件查询
	 * @param condition 查询对象  <br />
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @return 返回实体对象集合
	 */
	public List<T> finds(ICondition condition);
	
	/**
	 * 根据条件分页查询
	 * @param condition 条件对象   <br />
	 * 通过{@link com.mixsmart.spellsql.utils.Cnd}.方法名({@link com.mixsmart.spellsql.utils.Exp}.方法名())来设置条件；<br />
	 * 如：Cnd.where(Exp.eq("name","张三"))
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<T> finds(ICondition condition, int pageNo, int pageSize);
	
	/**
	 * 根据HQL语句查询
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 返回实体对象集合
	 */
	public List<T> queryHql(String hql,HashMap<String,Object> params);
	
	/**
	 * HQL语句根据参数过滤后，查询数据
	 * @param hql HQL语句
	 * @param params 参数
	 * @return 返回实体对象集合
	 */
	public List<T> queryHqlFilter(String hql,HashMap<String,Object> params);
	
	/**
	 * 根据HQL语句分页查询
	 * @param hql HQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<T> queryHql(String hql, HashMap<String,Object> params,
			int pageNo, int pageSize);
	
	/**
	 * HQL语句根据参数过滤后，分页查询
	 * @param hql HQL语句
	 * @param params 参数
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public Paginate<T> queryHqlFilter(String hql, HashMap<String,Object> params,
			int pageNo, int pageSize);
	
	/**
	 * 通过SQL语句查询，获取指定的 <code>clazz</code> 实体对象
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param clazz 指定的实体对象
	 * @return 返回指定的实体对象
	 */
	public <E> E queryEntityBySql(String sql, HashMap<String,Object> params, Class<? extends IEntityBean> clazz);
	
	/**
	 * 通过SQL语句查询，获取指定的 <code>clazz</code> 实体对象集合（列表）
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param clazz 指定的实体对象
	 * @return 返回指定的实体对象集合（列表）
	 */
	public <E> List<E> queryEntitysBySql(String sql, HashMap<String,Object> params, Class<? extends IEntityBean> clazz);
	
	/**
	 * 通过SQL语句分页查询，获取指定的 <code>clazz</code> 实体对象集合（列表）
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param clazz 指定的实体对象
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> queryEntitysBySql(String sql, HashMap<String,Object> params, Class<? extends IEntityBean> clazz, int pageNo, int pageSize);
	
	/**
	 * 根据提供SQL及参数，进行过滤处理（对象SQL语句及参数都进行过滤处理）；
	 * 然后在根据处理后的SQL语句及参数进行查询，获取指定的 <code>clazz</code> 实体对象集合（列表）
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param clazz 指定的实体对象
	 * @return 返回指定的实体对象集合（列表）
	 */
	public <E> List<E> queryEntitysBySqlFilter(String sql, HashMap<String,Object> params, Class<? extends IEntityBean> clazz);
	
	/**
	 * 根据提供SQL及参数，进行过滤处理（对象SQL语句及参数都进行过滤处理）；
	 * 然后在根据处理后的SQL语句及参数进行分页查询，获取指定的 <code>clazz</code> 实体对象集合（列表）
	 * @param sql SQL语句
	 * @param params SQL语句参数
	 * @param clazz 指定的实体对象
	 * @param pageNo 页面数
	 * @param pageSize 每页显示数
	 * @return 返回分页对象
	 */
	public <E> Paginate<E> queryEntitysBySqlFilter(String sql, HashMap<String,Object> params, Class<? extends IEntityBean> clazz, int pageNo, int pageSize);
	
	/**
	 * 按条件统计
	 * @param condition 条件对象
	 * @return 统计结果
	 */
	public Long count(ICondition condition);
	
}
